package main

import "fmt"

func ExecuteFunc() (Calculation, func(num1, num2 int8) int8) {
	var calculation Calculation = Sub
	return calculation, Add
}

func Calc(num1, num2 int8, handle func(num1, num2 int8) int8, calculation Calculation) (add int8, sub int8) {
	return handle(num1, num2), calculation(num1, num2)
}

type Calculation func(num1, num2 int8) int8

func Add(num1, num2 int8) int8 {
	return num1 + num2
}

func Sub(num1, num2 int8) int8 {
	return num1 - num2
}

//全局变量
var variable1 int8 = 1

func Variable() {
	//访问全局变量
	fmt.Println(variable1)
	//定义局部变量，局部变量优先级高
	variable1 := 2
	fmt.Println(variable1) // 2
	//语句块变量
	for i := 0; i < 1; i++ {
		fmt.Println(i) // 1
	}
}

// FuncResp2 在返回值中声明变量
func FuncResp2() (resp1, resp2 int) {
	resp1 = 1
	resp2 = 2
	return
}

// FuncResp1 定义多返回值函数
func FuncResp1() (int, string) {
	return 1, "A"
}

// FuncResp3 返回未初始化的切片
func FuncResp3() []int {
	return nil
}

// FormatFunc 定义函数类型
type FormatFunc func(s string, x, y int) string

// Format 定义函数类型的入参
func Format(formatFunc FormatFunc, s string, x, y int) string {
	return formatFunc(s, x, y)
}

// Test 定义匿名函数类型的入参
func Test(fu func() int) int {
	return fu()
}

// ParamsShortening 参数类型简写
func ParamsShortening(x, y, z int) int {
	return x + y + z
}

// IndefiniteParameters 不定参数
func IndefiniteParameters(x int, y ...int) (int, int) {
	var sum int
	for num := range y {
		sum += num
	}
	return x, sum
}
